package com.corpgovernment.common.enums;

/**
 * @author dlz
 * @since 2023/8/3
 */
public interface CodeEnum {
    /**
     * 获取此枚举的唯一Code
     */
    String getCode();

    /**
     * 通过Code获取枚举，需要该枚举类实现 CodeEnum接口。
     *
     * @param clazz 实现了CodeEnum接口接口的枚举类类型
     * @param code 需要匹配的code
     * @param defaultValue 匹配不到时的默认值
     * @param <T> 实现了CodeEnum接口接口的枚举类
     * @return 枚举类实体
     */
    static <T extends Enum<T> & CodeEnum> T getByCode(Class<T> clazz, String code, T defaultValue) {
        for (T codeEnum : clazz.getEnumConstants()) {
            if (codeEnum.getCode().equals(code)) {
                return codeEnum;
            }
        }
        return defaultValue;
    }

    /**
     * 通过Code获取枚举，需要该枚举类实现 CodeEnum接口。
     *
     * @param clazz 实现了CodeEnum接口接口的枚举类类型
     * @param code 需要匹配的code
     * @param <T> 实现了CodeEnum接口接口的枚举类
     * @return 枚举类实体,匹配不到返回null
     */
    static <T extends Enum<T> & CodeEnum> T getByCode(Class<T> clazz, String code) {
        return getByCode(clazz, code, null);
    }

    /**
     * 通过Code获取枚举，需要该枚举类实现 CodeEnum接口。
     *
     * @param clazz 实现了CodeEnum接口接口的枚举类类型
     * @param code 需要匹配的code
     * @param <T> 实现了CodeEnum接口接口的枚举类
     * @return 枚举类实体,匹配不到返回null
     */
    static <T extends Enum<T> & CodeEnum> T getByCode(String code, Class<T> clazz) {
        return getByCode(clazz, code, null);
    }

    /**
     * 通过Code获取枚举，需要该枚举类实现 CodeEnum接口。
     *
     * @param clazz 实现了CodeEnum接口接口的枚举类类型
     * @param code 需要匹配的code
     * @param <T> 实现了CodeEnum接口接口的枚举类
     * @return 枚举类实体,匹配不到返回null
     */
    static <T extends Enum<T> & CodeEnum> T getByCode(String code, Class<T> clazz, T defaultValue) {
        return getByCode(clazz, code, null);
    }
}
